﻿using System;
using System.Collections.Generic;
using System.Linq;
using System.Text;
using Capa_Entidad;

namespace Acceso_Datos.Clases_DAO
{
    public class clsHis_Historia_ClinicaDAO
    {
        private BDClinicaEntities ContextoDeObjs = new BDClinicaEntities();

        public bool Insertar(HIS_HISTORIA_CLINICA Obj)
        {
            try
            {
                ContextoDeObjs.AddObject("HIS_HISTORIA_CLINICA", Obj);
                ContextoDeObjs.SaveChanges();
                return true;
            }
            catch (Exception)
            {
                return false;
            }
        }
        public bool Modificar(HIS_HISTORIA_CLINICA obj)
        {
            try
            {
                ContextoDeObjs.AttachTo("HIS_HISTORIA_CLINICA", obj);
                ContextoDeObjs.ObjectStateManager.ChangeObjectState(obj, System.Data.EntityState.Modified);
                ContextoDeObjs.SaveChanges();
                return true;
            }
            catch (Exception)
            {
                return false;

            }
        }
        public bool Eliminar(HIS_HISTORIA_CLINICA obj)
        {
            try
            {
                ContextoDeObjs.AttachTo("HIS_HISTORIA_CLINICA", obj);
                ContextoDeObjs.DeleteObject(obj);
                ContextoDeObjs.SaveChanges();
                return true;
            }
            catch (Exception)
            {
                return false;
            }
        }

        public bool InsertarDetalle(int idAtencion,int idHistorial)
        {
            try
            {
                //ContextoDeObjs.AddObject("VW_DETALLE_HISTORIA_CLINICA", Obj);
                //ContextoDeObjs.SaveChanges();
                ContextoDeObjs.ExecuteStoreCommand("INSERT INTO HIS_DETALLE_HISTORIA_CLINICA (ATE_ID_ATENCION,HC_ID_HISTORIA_CLINICA)VALUES('" + idAtencion + "','" + idHistorial + "')");
                return true;
          
            }
            catch (Exception)
            {
                return false;
            }
        }
        public List<HIS_HISTORIA_CLINICA> ListarHistorialPaciente(int IdPaciente) {
            try {
                List<HIS_HISTORIA_CLINICA> historia = new List<HIS_HISTORIA_CLINICA>();
                var q = from p in ContextoDeObjs.HIS_HISTORIA_CLINICA
                        where p.PAC_ID_PACIENTE == IdPaciente
                        select p;
                historia = q.ToList();
                return historia;
            }
            catch {
                return null;
            }
       
        }
        public int TraerUltimiIdHistoriaClinica()
        {
            try
            {
                int codigo = 1;
                var q = from t in
                            (from t in ContextoDeObjs.HIS_HISTORIA_CLINICA
                             select new
                             {
                                 t.HC_ID_HISTORIA_CLINICA,
                                 Dummy = "x"
                             })
                        group t by new { t.Dummy } into g
                        select new
                        {
                            codcama = (System.Int32?)(g.Max(p => p.HC_ID_HISTORIA_CLINICA) + 1)
                        };
                codigo = (q.ToList()[0].codcama != null) ? Convert.ToInt32(q.ToList()[0].codcama) : 1;
                return codigo;
            }
            catch (Exception)
            {
                return (1);
            }
        }
        public List<V_His_Historia_Clinica> listar()
        {
            try
            {
                List<V_His_Historia_Clinica> lista = new List<V_His_Historia_Clinica>();
                var q = from c in ContextoDeObjs.V_His_Historia_Clinica
                        orderby c.GHC_NRO_HISTORIA_CLINICA
                        select c;
                lista = q.ToList();
                return lista;
            }
            catch (Exception)
            {
                return null;
            }
        }
        public List<V_His_Historia_Clinica> listar(int codigo)
        {
            try
            {
                List<V_His_Historia_Clinica> lista = new List<V_His_Historia_Clinica>();
                var q = from c in ContextoDeObjs.V_His_Historia_Clinica
                        where c.HC_ID_HISTORIA_CLINICA == codigo
                        orderby c.GHC_NRO_HISTORIA_CLINICA
                        select c;
                lista = q.ToList();
                return lista;
            }
            catch (Exception)
            {
                return null;
            }
        }
        public List<V_His_Historia_Clinica_x_Paciente> listar(int? nroHC, String nroDNI, String nomPAC)
        {
            List<V_His_Historia_Clinica_x_Paciente> lista = new List<V_His_Historia_Clinica_x_Paciente>();
            try
            {
                var q = from c in ContextoDeObjs.V_His_Historia_Clinica_x_Paciente
                        orderby c.HC_FECHA_CREACION descending
                        where 1 == 1
                        select c;
                if (nroHC != null) q = q.Where(f1 => f1.GHC_NRO_HISTORIA_CLINICA == nroHC);
                if (nroDNI != String.Empty) q = q.Where(f1 => f1.PAC_NRO_DOCUMENTO.Contains(nroDNI));
                if (nomPAC != String.Empty) q = q.Where(f1 => f1.NOMBRES.ToUpper().Contains(nomPAC.ToUpper()));
                lista = q.ToList();
            }
            catch (Exception)
            {
                lista = null;
            }
            return lista;
        }
        public List<V_Atencion_x_Paciente> listarAtencion(int nroHC)
        {
            List<V_Atencion_x_Paciente> lista = new List<V_Atencion_x_Paciente>();
            try
            {
                var q = from c in ContextoDeObjs.V_Atencion_x_Paciente
                        orderby c.ATE_FECHA_INGRESO descending
                        where c.GHC_NRO_HISTORIA_CLINICA == nroHC
                        select c;
                lista = q.ToList();
            }
            catch (Exception)
            {
                lista = null;
            }
            return lista;
        }
        public IEnumerable<Object> listarDiagnosticos(int idAtencion)
        {
            IEnumerable<Object> lista = new List<Object>();
            try
            {
                var q = from t in ContextoDeObjs.ATE_ATENCION
                        join t0 in ContextoDeObjs.ATE_ATENCION_DIAGNOSTICO on t.ATE_ID_ATENCION equals t0.ATE_ATENCION.ATE_ID_ATENCION
                        join t1 in ContextoDeObjs.GEN_DIAGNOSTICO on new { ATD_ID_DIAGNOSTICO = t0.ATD_ID_DIAGNOSTICO } equals new { ATD_ID_DIAGNOSTICO = t1.DIA_ID_DIAGNOSTICO }
                        where
                          t.ATE_ID_ATENCION == idAtencion
                        orderby
                          t1.DIA_DESCRIPCION
                        select new
                        {
                            ATD_ID_DIAGNOSTICO = (Int32?)t0.ATD_ID_DIAGNOSTICO,
                            t1.DIA_CODIGO_CIE10,
                            t1.DIA_DESCRIPCION
                        };
                lista = q.ToList();
            }
            catch (Exception)
            {
                lista = null;
            }
            return lista;
        }

        public IEnumerable<Object> listarExamenes(int idAtencion)
        {
            IEnumerable<Object> lista = new List<Object>();
            try
            {
                var q = from t in ContextoDeObjs.V_Atenciones_Examenes
                        where t.ATE_ID_ATENCION == idAtencion
                        select new
                        {
                            t.ATE_ID_EXAMEN,
                            t.ATE_FECHA,
                            t.ATE_DESCRIPCION,
                            t.MEDICO,
                            t.ATE_ID_ATENCION
                        };
                lista = q.ToList();
            }
            catch (Exception)
            {
                lista = null;
            }
            return lista;
        }

        public IEnumerable<Object> listarHospitalizaciones(int? idAtencion)
        {
            IEnumerable<Object> lista = new List<Object>();
            try
            {
                var pac = from c1 in ContextoDeObjs.ATE_ATENCION
                          from c2 in ContextoDeObjs.HIS_HISTORIA_CLINICA
                          join c3 in ContextoDeObjs.ADM_PACIENTE on c2.ADM_PACIENTE.PAC_ID_PACIENTE equals c3.PAC_ID_PACIENTE
                          where
                            c1.ATE_ID_ATENCION == idAtencion
                          select new
                          {
                              PAC_ID_PACIENTE = (Int32?)c3.PAC_ID_PACIENTE
                          };

                int? idpaciente = pac.ToList()[0].PAC_ID_PACIENTE;

                var q = from t in ContextoDeObjs.HOS_RESERVACION_CAMA
                        join t0 in ContextoDeObjs.ADM_PACIENTE on t.ADM_PACIENTE.PAC_ID_PACIENTE equals t0.PAC_ID_PACIENTE
                        join t1 in ContextoDeObjs.HOS_HISTORICO_CAMA on t0.PAC_ID_PACIENTE equals t1.PAC_ID_PACIENTE
                        join t2 in ContextoDeObjs.HOS_CAMA on t1.CAM_ID_CAMA equals t2.CAM_ID_CAMA
                        join t3 in ContextoDeObjs.HOS_ESTADO_CAMA on new { ESC_ID_ESTADO = t2.HOS_ESTADO_CAMA.ESC_ID_ESTADO } equals new { ESC_ID_ESTADO = t3.ESC_ID_ESTADO }
                        join t4 in ContextoDeObjs.GEN_MEDICO on t.GEN_MEDICO.MED_ID_MEDICO equals t4.MED_ID_MEDICO
                        join t5 in ContextoDeObjs.GEN_EMPLEADO on t4.GEN_EMPLEADO.EMP_ID_EMPLEADO equals t5.EMP_ID_EMPLEADO
                        join t6 in ContextoDeObjs.ATE_ATENCION on new { MED_ID_MEDICO_INGRESO = t4.MED_ID_MEDICO } equals new { MED_ID_MEDICO_INGRESO = t6.GEN_MEDICO.MED_ID_MEDICO }
                        where
                          1 == 1 &&
                          t6.ATE_ID_ATENCION == idAtencion &&
                          t0.PAC_ID_PACIENTE == idpaciente
                        select new
                        {
                            t.REC_ID_RESERVACION_CAMAS,
                            t.REC_FECHA_HORA_RESERVA,
                            t.REC_FECHA_HORA_INGRESO,
                            MEDICO = (t5.EMP_APELLIDO_PATERNO.ToUpper() + " " + t5.EMP_APELLIDO_MATERNO.ToUpper() + ", " + t5.EMP_NOMBRES.ToUpper())
                        };
                lista = q.ToList();
            }
            catch (Exception)
            {
                lista = null;
            }
            return lista;
        }
        public IEnumerable<Object> listarMedicamentos(int? idAtencion)
        {
            IEnumerable<Object> lista = new List<Object>();
            try
            {
                var q = from t in ContextoDeObjs.ATE_ATENCION
                        join t0 in ContextoDeObjs.ATE_ATENCION_RECETA on t.ATE_ID_ATENCION equals t0.ATE_ATENCION.ATE_ID_ATENCION
                        join t1 in ContextoDeObjs.ATE_DETALLE_RECETA on t0.ATR_ID_RECETA equals t1.ATE_ATENCION_RECETA.ATR_ID_RECETA
                        join t2 in ContextoDeObjs.CYF_PRODUCTO on t1.CYF_PRODUCTO.PRO_ID_PRODUCTO equals t2.PRO_ID_PRODUCTO
                        where
                          t.ATE_ID_ATENCION == idAtencion
                        select new
                        {
                            PRO_ID_PRODUCTO = (Int32?)t2.PRO_ID_PRODUCTO,
                            t0.ATR_NRO_RECETA,
                            t0.ATR_FECHA,
                            t2.PRO_DES_PRODUCTO
                        };
                lista = q.ToList();
            }
            catch (Exception)
            {
                lista = null;
            }
            return lista;
        }
        public List<V_LISTA_PACIENTE_NROHISTORIA> ListarNroPaciente(int NroHistoria) { 
            List<V_LISTA_PACIENTE_NROHISTORIA> lista=new List<V_LISTA_PACIENTE_NROHISTORIA>();
            try{
                var q = from c in ContextoDeObjs.V_LISTA_PACIENTE_NROHISTORIA
                        where c.GHC_NRO_HISTORIA_CLINICA == NroHistoria
                        select c;
                lista = q.ToList();
                return lista;
            }catch{
                return lista;
            }
        }
    }
}
